package testes;
import static org.junit.Assert.*;
import iscte.es.copaPaises.businessLayer.*;

import java.util.HashSet;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

public class JogoTest {
	private Jogo j;
	private CalendarDate dia;
	private String hora;
	private Grupo grupo;
	private Estadio estadio;
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Before
	public void setUp() throws Exception {
		j=new Jogo();
		dia=new CalendarDate(23, 4, 2009);
		hora="01:45+UTC+3";
		grupo=new Grupo();
		estadio=new Estadio();
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testJogo() {
		assertTrue("Jogo()",Jogo.allInstances.contains(j));
	}

	@Test
	public void testJogoCalendarDateStringGrupoEstadio() {
		j=new Jogo(dia,hora,grupo,estadio);
		assertTrue("Jogo()",Jogo.allInstances.contains(j));
	}

	@Test
	public void testSetDia() {
		j.setDia(dia);
		assertEquals("Setter/Getter Jogo.dia()",j.dia(),dia);
	}

	@Test
	public void testHora() {
		j.setHora(hora);
		assertEquals("Setter/Getter Jogo.hora()",j.hora(),hora);
	}

	@Test
	public void testGrupo() {
		j.setGrupo(grupo);
		assertEquals("Setter/Getter Jogo.grupo()",j.grupo(),grupo);
	}

	@Test
	public void testEstadio() {
		j.setEstadio(estadio);
		assertEquals("Setter/Getter Jogo.estadio()",j.estadio(),estadio);
	}

	@Test
	public void testSetEquipa() {
		Equipa e1=new Equipa();
		Equipa e2=new Equipa();
		Equipa e3=new Equipa();
		SortedSet<Equipa> equipas=new TreeSet<Equipa>();
		equipas.add(e1);
		equipas.add(e2);
		j.setEquipa(equipas);
		assertTrue("Setter Getter Jogo.equipa()",j.equipa().contains(e1));
		assertTrue("Setter Getter Jogo.equipa()",j.equipa().contains(e2));
		assertFalse("Setter Getter Jogo.equipa()",j.equipa().contains(e3));
	}

	@Test
	public void testSetSeleccao() {
		Pais p3=new Pais();
		Pais p1=new Pais();
		Pais p2=new Pais();

		Equipa e1=new Equipa();
		Equipa e2=new Equipa();
		SortedSet<Equipa> equipas=new TreeSet<Equipa>();
		SortedSet<Pais> paises=new TreeSet<Pais>();

		equipas.add(e1);equipas.add(e2);
		j.setEquipa(equipas);

		paises.add(p1);paises.add(p2);
		j.setSeleccao(paises);

		assertTrue("Setter Getter Jogo.seleccao()",j.seleccao().contains(p1));
		assertTrue("Setter Getter Jogo.seleccao()",j.seleccao().contains(p2));
		assertFalse("Setter Getter Jogo.seleccao()",j.seleccao().contains(p3));
	}

	@Test
	public void testInicializaStringStringPaisPaisEstadioGrupo(){
		Pais visitado=new Pais();
		Pais visitante=new Pais();
		int equipas=Equipa.allInstances.size();
		j.inicializa("2009-04-23", hora,visitado, visitante,estadio,grupo);
		assertEquals("Jogo.inicializa(data, hora,visitado, visitante,estadio,grupo)",equipas+2,Equipa.allInstances.size());
		assertEquals(j.hora(),hora);
		assertEquals(j.estadio(),estadio);
		assertEquals(j.grupo(),grupo);
	}


	@Test
	public void testStringToHours() {
		String hora2="1:45+UTC+4";
		j.setHora(hora2);
		double h2=j.stringToHours();
		j.setHora(hora);
		double h1=j.stringToHours();
		String h_s=""+h1;
		assertEquals("Jogo.StringToHours()",h_s,"4.75");
		String h2_s=""+h2;
		assertEquals("Jogo.StringToHours()",h2_s,"5.75");
	}

	@Test
	public void testVencedor() {
		//Cria jogo,paises e campeonato
		Equipa.allInstances.clear();
		Pais visitado=new Pais();visitado.setNome("Angola");
		Pais visitante=new Pais();visitante.setNome("Alemanha");
		Campeonato campeonato=new Campeonato();
		grupo.setCampeonato(campeonato);
		j.inicializa("2009-04-23", hora,visitado, visitante,estadio,grupo);

		//Cria membros
		Membro m1=new Membro();//Membro de Angola
		Membro m2=new Membro();//Membro de Alemanha
		Set<Membro> membros=new HashSet<Membro>();
		membros.add(m1);
		j.equipa().getFirst().setMembro(membros);
		membros.clear();
		membros.add(m2);
		j.equipa().getLast().setMembro(membros);

		//Cria resultado de jogo 
		//Angola 2 - 1 Alemanha
		new Golo(0, m1);
		new Golo(0, m1);
		new Golo(0, m2);

		assertEquals("Angola",j.vencedor());

		//Angola 2 - 2 Alemanha
		new Golo(0, m2);

		assertEquals("Empate",j.vencedor());

		//Angola 2 - 2 Alemanha
		new Golo(0, m2);

		assertEquals("Alemanha",j.vencedor());
	}

	@Test
	public void testToString() {
		j=new Jogo(dia,hora,grupo,estadio);
		assertEquals(" Jogo.toString()",j.toString(),"Jogo [dia=" + dia + ", hora=" + hora + ", grupo=" + grupo + ", estadio=" + estadio + "]\n");
	}

}
